#include<iostream>
#include<unistd.h>
#include<signal.h>
#include<functional>
#include<vector>
#include<sys/types.h>
#include<sys/wait.h>


using namespace std;

void PrintPending(sigset_t &pending)
{
    cout<<"curr process["<<getpid()<<"]pending";
    for(int signo=31;signo>=1;signo--)
    {
        if(sigismember(&pending,signo))
        {
            cout<<1;
        }
        else
        {
            cout<<0;
        }
    }
    cout<<"\n";
}

void handler(int signo)
{
    cout<<signo<<"信号被送达！！！"<<endl;

    cout<<"-----------------------------"<<endl;
    sigset_t pending;
    sigpending(&pending);
    PrintPending(pending);
    cout<<"-----------------------------"<<endl;
}

int main()
{
    signal(2,handler);

    sigset_t block_set,old_set;
    sigemptyset(&block_set);
    sigemptyset(&old_set);
    sigaddset(&block_set,SIGINT);
    
    sigprocmask(SIG_BLOCK,&block_set,&old_set);

    int cnt=15;
    while(1)
    {
        sigset_t pending;
        sigpending(&pending);

        PrintPending(pending);
        cnt--;

        if(cnt==0)
        {
            cout<<"解除对2号信号的屏蔽！！！"<<endl;
            sigprocmask(SIG_SETMASK,&block_set,&old_set);

        }

        sleep(1);

    }
    return 0;
}
//using func_t = function<void()>;

// int gcount = 0;
// vector<func_t> gfuncs;

// void handler(int signo)
// {
//     for(auto &f : gfuncs)
//     {
//         f();
//     }
//     cout<<"gcount:"<<gcount<<endl;
//     int n = alarm(1);
//     cout<<"剩余时间："<<n<<endl;
// }

// int main()
// {
//     alarm(4);
//     signal(SIGALRM,handler);

//     while(1)
//     {
//         pause();
//         cout<<"我醒来了"<<endl;
//         gcount++;
//     }
// }

// int count=0;

// void handler(int signumber)
// {
//     cout<<"获取一个信号："<<signumber<<endl;
// }

// void handler(int signumber)
// {
//     cout<<"count:"<<count<<endl;
//     exit(0);
// }


// int main()
// {
//     signal(2,handler);

//     while(1)
//     {
//         sleep(1);
//         raise(2);
//     }
//     return 0;
// }

// int main()
// {
//     signal(SIGABRT,handler);

//     while(1)
//     {
//         sleep(1);
//         abort();
//     }
//     return 0;
// }

// int main()
// {
//     int count = 0;
//     alarm(1);
//     while(1)
//     {
//         cout<<"count:"<<count<<endl;
//         count++;
//     }
//     return 0;
// }

// int main()
// {
//    signal(SIGALRM,handler);
//     alarm(1);
//     while(1)
//     {
//         count++;
//     }
//     return 0;
// }
